package com.musemun.exception;


import com.alibaba.fastjson.JSONObject;
import com.musemun.common.ResultCode;
import com.musemun.common.CommonResult;
import com.musemun.common.ResultUtil;
import com.musemun.config.MyDefineAnnotation;
import com.musemun.contants.ReturnType;
import lombok.SneakyThrows;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author winner
 * @description: winner 定义的错误处理类
 * @date 2020/4/14
 */
@Configuration
@RestControllerAdvice
public class ErrorExceptionHandler<T>{

    /**
     * api异常处理返回json封装字符串对象
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = ApiException.class)
    public CommonResult<Object> paramError(ApiException e) {
        return ResultUtil.error(e.getCode(), e.getMessage(), e.getData());
    }

    @ExceptionHandler(value = MyDefineException.class)
    public CommonResult<Object> returnMyDefineException(MyDefineException e){
        return new CommonResult<Object>(e.getCode(),e.getMsg());
    }

//    /**
//     * 校验异常处理
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(BindException.class)
//    @ResponseBody
//    public CommonResult bindExceptionHandler(BindException e) {
//        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
//        return ResultUtil.error(400, message);
//    }
//
//
//    /**
//     * 校验异常处理
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(ConstraintViolationException.class)
//    @ResponseBody
//    public CommonResult constraintViolationExceptionHandler(ConstraintViolationException e) {
//        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
//        return ResultUtil.error(400, message);
//    }
//
//
//    /**
//     * 校验异常处理
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    @ResponseBody
//    public CommonResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
//        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
//        return ResultUtil.error(400, message);
//    }
}
